{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e943b117",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyspark import SparkContext"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6ce23328",
   "metadata": {},
   "outputs": [],
   "source": [
    "sc = SparkContext(\"local\", \"app\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "86317555",
   "metadata": {},
   "outputs": [],
   "source": [
    "RawSalesDataRDD = sc.textFile(\"/home/jupyter/sales_data.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c335ce99",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2824"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "RawSalesDataRDD.count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f23ede7b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['\"ORDERNUMBER,QUANTITYORDERED,PRICEEACH,ORDERLINENUMBER,SALES,\"\"ORDERDATE\"\",\"\"STATUS\"\",QTR_ID,MONTH_ID,YEAR_ID,\"\"PRODUCTLINE\"\",MSRP,\"\"PRODUCTCODE\"\",\"\"CUSTOMERNAME\"\",\"\"PHONE\"\",\"\"ADDRESSLINE1\"\",\"\"ADDRESSLINE2\"\",\"\"CITY\"\",\"\"STATE\"\",\"\"POSTALCODE\"\",\"\"COUNTRY\"\",\"\"TERRITORY\"\",\"\"CONTACTLASTNAME\"\",\"\"CONTACTFIRSTNAME\"\"\"',\n",
       " '\"10107,30,95.7,2,2871,\"\"2/24/2003 0:00\"\",\"\"Shipped\"\",1,2,2003,\"\"Motorcycles\"\",95,\"\"S10_1678\"\",\"\"Land of Toys Inc.\"\",\"\"2125557818\"\",\"\"897 Long Airport Avenue\"\",,\"\"NYC\"\",\"\"NY\"\",\"\"10022\"\",\"\"United States\"\",\"\"NA\"\",\"\"Yu\"\",\"\"Kwai\"\"\"',\n",
       " '\"10121,34,81.35,5,2765.9,\"\"5/7/2003 0:00\"\",\"\"Shipped\"\",2,5,2003,\"\"Motorcycles\"\",95,\"\"S10_1678\"\",\"\"Reims Collectables\"\",\"\"26.47.1555\"\",\"\"59 rue de l\\'Abbaye\"\",,\"\"Reims\"\",,\"\"51100\"\",\"\"France\"\",\"\"EMEA\"\",\"\"Henriot\"\",\"\"Paul\"\"\"',\n",
       " '\"10134,41,94.74,2,3884.34,\"\"7/1/2003 0:00\"\",\"\"Shipped\"\",3,7,2003,\"\"Motorcycles\"\",95,\"\"S10_1678\"\",\"\"Lyon Souveniers\"\",\"\"+33 1 46 62 7555\"\",\"\"27 rue du Colonel Pierre Avia\"\",,\"\"Paris\"\",,\"\"75508\"\",\"\"France\"\",\"\"EMEA\"\",\"\"Da Cunha\"\",\"\"Daniel\"\"\"',\n",
       " '\"10145,45,83.26,6,3746.7,\"\"8/25/2003 0:00\"\",\"\"Shipped\"\",3,8,2003,\"\"Motorcycles\"\",95,\"\"S10_1678\"\",\"\"Toys4GrownUps.com\"\",\"\"6265557265\"\",\"\"78934 Hillside Dr.\"\",,\"\"Pasadena\"\",\"\"CA\"\",\"\"90003\"\",\"\"USA\"\",\"\"NA\"\",\"\"Young\"\",\"\"Julie\"\"\"']"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "RawSalesDataRDD.take(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "943c99d6",
   "metadata": {},
   "outputs": [],
   "source": [
    "header = RawSalesDataRDD.first()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ce342b0a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'\"ORDERNUMBER,QUANTITYORDERED,PRICEEACH,ORDERLINENUMBER,SALES,\"\"ORDERDATE\"\",\"\"STATUS\"\",QTR_ID,MONTH_ID,YEAR_ID,\"\"PRODUCTLINE\"\",MSRP,\"\"PRODUCTCODE\"\",\"\"CUSTOMERNAME\"\",\"\"PHONE\"\",\"\"ADDRESSLINE1\"\",\"\"ADDRESSLINE2\"\",\"\"CITY\"\",\"\"STATE\"\",\"\"POSTALCODE\"\",\"\"COUNTRY\"\",\"\"TERRITORY\"\",\"\"CONTACTLASTNAME\"\",\"\"CONTACTFIRSTNAME\"\"\"'"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "header"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0183c0de",
   "metadata": {},
   "outputs": [],
   "source": [
    "RawSalesDataRDD = RawSalesDataRDD.filter(lambda row:row!=header)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "543458da",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['\"10107,30,95.7,2,2871,\"\"2/24/2003 0:00\"\",\"\"Shipped\"\",1,2,2003,\"\"Motorcycles\"\",95,\"\"S10_1678\"\",\"\"Land of Toys Inc.\"\",\"\"2125557818\"\",\"\"897 Long Airport Avenue\"\",,\"\"NYC\"\",\"\"NY\"\",\"\"10022\"\",\"\"United States\"\",\"\"NA\"\",\"\"Yu\"\",\"\"Kwai\"\"\"',\n",
       " '\"10121,34,81.35,5,2765.9,\"\"5/7/2003 0:00\"\",\"\"Shipped\"\",2,5,2003,\"\"Motorcycles\"\",95,\"\"S10_1678\"\",\"\"Reims Collectables\"\",\"\"26.47.1555\"\",\"\"59 rue de l\\'Abbaye\"\",,\"\"Reims\"\",,\"\"51100\"\",\"\"France\"\",\"\"EMEA\"\",\"\"Henriot\"\",\"\"Paul\"\"\"',\n",
       " '\"10134,41,94.74,2,3884.34,\"\"7/1/2003 0:00\"\",\"\"Shipped\"\",3,7,2003,\"\"Motorcycles\"\",95,\"\"S10_1678\"\",\"\"Lyon Souveniers\"\",\"\"+33 1 46 62 7555\"\",\"\"27 rue du Colonel Pierre Avia\"\",,\"\"Paris\"\",,\"\"75508\"\",\"\"France\"\",\"\"EMEA\"\",\"\"Da Cunha\"\",\"\"Daniel\"\"\"',\n",
       " '\"10145,45,83.26,6,3746.7,\"\"8/25/2003 0:00\"\",\"\"Shipped\"\",3,8,2003,\"\"Motorcycles\"\",95,\"\"S10_1678\"\",\"\"Toys4GrownUps.com\"\",\"\"6265557265\"\",\"\"78934 Hillside Dr.\"\",,\"\"Pasadena\"\",\"\"CA\"\",\"\"90003\"\",\"\"USA\"\",\"\"NA\"\",\"\"Young\"\",\"\"Julie\"\"\"',\n",
       " '\"10159,49,100,14,5205.27,\"\"10/10/2003 0:00\"\",\"\"Shipped\"\",4,10,2003,\"\"Motorcycles\"\",95,\"\"S10_1678\"\",\"\"Corporate Gift Ideas Co.\"\",\"\"6505551386\"\",\"\"7734 Strong St.\"\",,\"\"San Francisco\"\",\"\"CA\"\",,\"\"United States\"\",\"\"NA\"\",\"\"Brown\"\",\"\"Julie\"\"\"']"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "RawSalesDataRDD.take(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "23aad5c3",
   "metadata": {},
   "outputs": [],
   "source": [
    "salesRDD = RawSalesDataRDD.map(lambda x:x.split(\",\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "8ed8a1e8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['\"10107',\n",
       "  '30',\n",
       "  '95.7',\n",
       "  '2',\n",
       "  '2871',\n",
       "  '\"\"2/24/2003 0:00\"\"',\n",
       "  '\"\"Shipped\"\"',\n",
       "  '1',\n",
       "  '2',\n",
       "  '2003',\n",
       "  '\"\"Motorcycles\"\"',\n",
       "  '95',\n",
       "  '\"\"S10_1678\"\"',\n",
       "  '\"\"Land of Toys Inc.\"\"',\n",
       "  '\"\"2125557818\"\"',\n",
       "  '\"\"897 Long Airport Avenue\"\"',\n",
       "  '',\n",
       "  '\"\"NYC\"\"',\n",
       "  '\"\"NY\"\"',\n",
       "  '\"\"10022\"\"',\n",
       "  '\"\"United States\"\"',\n",
       "  '\"\"NA\"\"',\n",
       "  '\"\"Yu\"\"',\n",
       "  '\"\"Kwai\"\"\"'],\n",
       " ['\"10121',\n",
       "  '34',\n",
       "  '81.35',\n",
       "  '5',\n",
       "  '2765.9',\n",
       "  '\"\"5/7/2003 0:00\"\"',\n",
       "  '\"\"Shipped\"\"',\n",
       "  '2',\n",
       "  '5',\n",
       "  '2003',\n",
       "  '\"\"Motorcycles\"\"',\n",
       "  '95',\n",
       "  '\"\"S10_1678\"\"',\n",
       "  '\"\"Reims Collectables\"\"',\n",
       "  '\"\"26.47.1555\"\"',\n",
       "  '\"\"59 rue de l\\'Abbaye\"\"',\n",
       "  '',\n",
       "  '\"\"Reims\"\"',\n",
       "  '',\n",
       "  '\"\"51100\"\"',\n",
       "  '\"\"France\"\"',\n",
       "  '\"\"EMEA\"\"',\n",
       "  '\"\"Henriot\"\"',\n",
       "  '\"\"Paul\"\"\"'],\n",
       " ['\"10134',\n",
       "  '41',\n",
       "  '94.74',\n",
       "  '2',\n",
       "  '3884.34',\n",
       "  '\"\"7/1/2003 0:00\"\"',\n",
       "  '\"\"Shipped\"\"',\n",
       "  '3',\n",
       "  '7',\n",
       "  '2003',\n",
       "  '\"\"Motorcycles\"\"',\n",
       "  '95',\n",
       "  '\"\"S10_1678\"\"',\n",
       "  '\"\"Lyon Souveniers\"\"',\n",
       "  '\"\"+33 1 46 62 7555\"\"',\n",
       "  '\"\"27 rue du Colonel Pierre Avia\"\"',\n",
       "  '',\n",
       "  '\"\"Paris\"\"',\n",
       "  '',\n",
       "  '\"\"75508\"\"',\n",
       "  '\"\"France\"\"',\n",
       "  '\"\"EMEA\"\"',\n",
       "  '\"\"Da Cunha\"\"',\n",
       "  '\"\"Daniel\"\"\"'],\n",
       " ['\"10145',\n",
       "  '45',\n",
       "  '83.26',\n",
       "  '6',\n",
       "  '3746.7',\n",
       "  '\"\"8/25/2003 0:00\"\"',\n",
       "  '\"\"Shipped\"\"',\n",
       "  '3',\n",
       "  '8',\n",
       "  '2003',\n",
       "  '\"\"Motorcycles\"\"',\n",
       "  '95',\n",
       "  '\"\"S10_1678\"\"',\n",
       "  '\"\"Toys4GrownUps.com\"\"',\n",
       "  '\"\"6265557265\"\"',\n",
       "  '\"\"78934 Hillside Dr.\"\"',\n",
       "  '',\n",
       "  '\"\"Pasadena\"\"',\n",
       "  '\"\"CA\"\"',\n",
       "  '\"\"90003\"\"',\n",
       "  '\"\"USA\"\"',\n",
       "  '\"\"NA\"\"',\n",
       "  '\"\"Young\"\"',\n",
       "  '\"\"Julie\"\"\"'],\n",
       " ['\"10159',\n",
       "  '49',\n",
       "  '100',\n",
       "  '14',\n",
       "  '5205.27',\n",
       "  '\"\"10/10/2003 0:00\"\"',\n",
       "  '\"\"Shipped\"\"',\n",
       "  '4',\n",
       "  '10',\n",
       "  '2003',\n",
       "  '\"\"Motorcycles\"\"',\n",
       "  '95',\n",
       "  '\"\"S10_1678\"\"',\n",
       "  '\"\"Corporate Gift Ideas Co.\"\"',\n",
       "  '\"\"6505551386\"\"',\n",
       "  '\"\"7734 Strong St.\"\"',\n",
       "  '',\n",
       "  '\"\"San Francisco\"\"',\n",
       "  '\"\"CA\"\"',\n",
       "  '',\n",
       "  '\"\"United States\"\"',\n",
       "  '\"\"NA\"\"',\n",
       "  '\"\"Brown\"\"',\n",
       "  '\"\"Julie\"\"\"']]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "salesRDD.take(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "05f8289a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyspark.sql import SparkSession"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "ae41b145",
   "metadata": {},
   "outputs": [],
   "source": [
    "sqlContext = SparkSession.builder.getOrCreate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "5ebf50e3",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pyspark.sql import Row"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "d05ef373",
   "metadata": {},
   "outputs": [],
   "source": [
    "saleRows = salesRDD.map(lambda p: Row(ORDERNUMBER=p[0],\n",
    "                                     QUANTITYORDERED=p[1],\n",
    "                                     PRICEEACH=p[2],\n",
    "                                     ORDERLINENUMBER=p[3],\n",
    "                                     SALES=p[4],\n",
    "                                     ORDERDATE=p[5],\n",
    "                                     STATUS=p[6],\n",
    "                                     QTR_ID=p[7],\n",
    "                                     MONTH_ID=p[8],\n",
    "                                     YEAR_ID=p[9],\n",
    "                                     PRODUCTLINE=p[10],\n",
    "                                     MSRP=p[11],\n",
    "                                     PRODUCTCODE=p[12],\n",
    "                                     CUSTOMERNAME=p[13],\n",
    "                                     PHONE=p[14],\n",
    "                                     ADDRESSLINE1=p[15],\n",
    "                                     ADDRESSLINE2=p[16],\n",
    "                                     CITY=p[17],\n",
    "                                     STATE=p[18],\n",
    "                                     POSTALCODE=p[19],\n",
    "                                     COUNTRY=p[20],\n",
    "                                     TERRITORY=p[21],\n",
    "                                     CONTACTLASTNAME=p[22],\n",
    "                                     CONTACTFIRSTNAME=p[23]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e837e554",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Row(ORDERNUMBER='\"10107', QUANTITYORDERED='30', PRICEEACH='95.7', ORDERLINENUMBER='2', SALES='2871', ORDERDATE='\"\"2/24/2003 0:00\"\"', STATUS='\"\"Shipped\"\"', QTR_ID='1', MONTH_ID='2', YEAR_ID='2003', PRODUCTLINE='\"\"Motorcycles\"\"', MSRP='95', PRODUCTCODE='\"\"S10_1678\"\"', CUSTOMERNAME='\"\"Land of Toys Inc.\"\"', PHONE='\"\"2125557818\"\"', ADDRESSLINE1='\"\"897 Long Airport Avenue\"\"', ADDRESSLINE2='', CITY='\"\"NYC\"\"', STATE='\"\"NY\"\"', POSTALCODE='\"\"10022\"\"', COUNTRY='\"\"United States\"\"', TERRITORY='\"\"NA\"\"', CONTACTLASTNAME='\"\"Yu\"\"', CONTACTFIRSTNAME='\"\"Kwai\"\"\"'),\n",
       " Row(ORDERNUMBER='\"10121', QUANTITYORDERED='34', PRICEEACH='81.35', ORDERLINENUMBER='5', SALES='2765.9', ORDERDATE='\"\"5/7/2003 0:00\"\"', STATUS='\"\"Shipped\"\"', QTR_ID='2', MONTH_ID='5', YEAR_ID='2003', PRODUCTLINE='\"\"Motorcycles\"\"', MSRP='95', PRODUCTCODE='\"\"S10_1678\"\"', CUSTOMERNAME='\"\"Reims Collectables\"\"', PHONE='\"\"26.47.1555\"\"', ADDRESSLINE1='\"\"59 rue de l\\'Abbaye\"\"', ADDRESSLINE2='', CITY='\"\"Reims\"\"', STATE='', POSTALCODE='\"\"51100\"\"', COUNTRY='\"\"France\"\"', TERRITORY='\"\"EMEA\"\"', CONTACTLASTNAME='\"\"Henriot\"\"', CONTACTFIRSTNAME='\"\"Paul\"\"\"'),\n",
       " Row(ORDERNUMBER='\"10134', QUANTITYORDERED='41', PRICEEACH='94.74', ORDERLINENUMBER='2', SALES='3884.34', ORDERDATE='\"\"7/1/2003 0:00\"\"', STATUS='\"\"Shipped\"\"', QTR_ID='3', MONTH_ID='7', YEAR_ID='2003', PRODUCTLINE='\"\"Motorcycles\"\"', MSRP='95', PRODUCTCODE='\"\"S10_1678\"\"', CUSTOMERNAME='\"\"Lyon Souveniers\"\"', PHONE='\"\"+33 1 46 62 7555\"\"', ADDRESSLINE1='\"\"27 rue du Colonel Pierre Avia\"\"', ADDRESSLINE2='', CITY='\"\"Paris\"\"', STATE='', POSTALCODE='\"\"75508\"\"', COUNTRY='\"\"France\"\"', TERRITORY='\"\"EMEA\"\"', CONTACTLASTNAME='\"\"Da Cunha\"\"', CONTACTFIRSTNAME='\"\"Daniel\"\"\"'),\n",
       " Row(ORDERNUMBER='\"10145', QUANTITYORDERED='45', PRICEEACH='83.26', ORDERLINENUMBER='6', SALES='3746.7', ORDERDATE='\"\"8/25/2003 0:00\"\"', STATUS='\"\"Shipped\"\"', QTR_ID='3', MONTH_ID='8', YEAR_ID='2003', PRODUCTLINE='\"\"Motorcycles\"\"', MSRP='95', PRODUCTCODE='\"\"S10_1678\"\"', CUSTOMERNAME='\"\"Toys4GrownUps.com\"\"', PHONE='\"\"6265557265\"\"', ADDRESSLINE1='\"\"78934 Hillside Dr.\"\"', ADDRESSLINE2='', CITY='\"\"Pasadena\"\"', STATE='\"\"CA\"\"', POSTALCODE='\"\"90003\"\"', COUNTRY='\"\"USA\"\"', TERRITORY='\"\"NA\"\"', CONTACTLASTNAME='\"\"Young\"\"', CONTACTFIRSTNAME='\"\"Julie\"\"\"'),\n",
       " Row(ORDERNUMBER='\"10159', QUANTITYORDERED='49', PRICEEACH='100', ORDERLINENUMBER='14', SALES='5205.27', ORDERDATE='\"\"10/10/2003 0:00\"\"', STATUS='\"\"Shipped\"\"', QTR_ID='4', MONTH_ID='10', YEAR_ID='2003', PRODUCTLINE='\"\"Motorcycles\"\"', MSRP='95', PRODUCTCODE='\"\"S10_1678\"\"', CUSTOMERNAME='\"\"Corporate Gift Ideas Co.\"\"', PHONE='\"\"6505551386\"\"', ADDRESSLINE1='\"\"7734 Strong St.\"\"', ADDRESSLINE2='', CITY='\"\"San Francisco\"\"', STATE='\"\"CA\"\"', POSTALCODE='', COUNTRY='\"\"United States\"\"', TERRITORY='\"\"NA\"\"', CONTACTLASTNAME='\"\"Brown\"\"', CONTACTFIRSTNAME='\"\"Julie\"\"\"')]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "saleRows.take(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "d32bbca9",
   "metadata": {},
   "outputs": [],
   "source": [
    "sale_df = sqlContext.createDataFrame(saleRows)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "6b7b3070",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "root\n",
      " |-- ORDERNUMBER: string (nullable = true)\n",
      " |-- QUANTITYORDERED: string (nullable = true)\n",
      " |-- PRICEEACH: string (nullable = true)\n",
      " |-- ORDERLINENUMBER: string (nullable = true)\n",
      " |-- SALES: string (nullable = true)\n",
      " |-- ORDERDATE: string (nullable = true)\n",
      " |-- STATUS: string (nullable = true)\n",
      " |-- QTR_ID: string (nullable = true)\n",
      " |-- MONTH_ID: string (nullable = true)\n",
      " |-- YEAR_ID: string (nullable = true)\n",
      " |-- PRODUCTLINE: string (nullable = true)\n",
      " |-- MSRP: string (nullable = true)\n",
      " |-- PRODUCTCODE: string (nullable = true)\n",
      " |-- CUSTOMERNAME: string (nullable = true)\n",
      " |-- PHONE: string (nullable = true)\n",
      " |-- ADDRESSLINE1: string (nullable = true)\n",
      " |-- ADDRESSLINE2: string (nullable = true)\n",
      " |-- CITY: string (nullable = true)\n",
      " |-- STATE: string (nullable = true)\n",
      " |-- POSTALCODE: string (nullable = true)\n",
      " |-- COUNTRY: string (nullable = true)\n",
      " |-- TERRITORY: string (nullable = true)\n",
      " |-- CONTACTLASTNAME: string (nullable = true)\n",
      " |-- CONTACTFIRSTNAME: string (nullable = true)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sale_df.printSchema()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "3ff5bab8",
   "metadata": {},
   "outputs": [],
   "source": [
    "sale_df.registerTempTable(\"sale_table\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "7cc70ebd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+------+\n",
      "|counts|\n",
      "+------+\n",
      "|  2823|\n",
      "+------+\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select count(*) counts from sale_table\").show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "08474d37",
   "metadata": {},
   "source": [
    "# 增加字段"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a39469a",
   "metadata": {},
   "source": [
    "## 使用DataFrame增加计算字段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "c7c248c5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+------------+----------------+\n",
      "|ORDERNUMBER| PRODUCTCODE|(2018 - YEAR_ID)|\n",
      "+-----------+------------+----------------+\n",
      "|     \"10107|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10121|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10134|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10145|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10159|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10168|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10180|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10188|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10201|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10211|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10223|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10237|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10251|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10263|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10275|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10285|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10299|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10309|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10318|\"\"S10_1678\"\"|            14.0|\n",
      "|     \"10329|\"\"S10_1678\"\"|            14.0|\n",
      "+-----------+------------+----------------+\n",
      "only showing top 20 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sale_df.select(\"ORDERNUMBER\", \"PRODUCTCODE\", (2018-sale_df.YEAR_ID)).show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ea4dd2b1",
   "metadata": {},
   "source": [
    "## 使用Spark SQL增加字段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "79e3c01c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+------------+------------------------------------------------+\n",
      "|ORDERNUMBER| PRODUCTCODE|(CAST(2018 AS DOUBLE) - CAST(YEAR_ID AS DOUBLE))|\n",
      "+-----------+------------+------------------------------------------------+\n",
      "|     \"10107|\"\"S10_1678\"\"|                                            15.0|\n",
      "|     \"10121|\"\"S10_1678\"\"|                                            15.0|\n",
      "|     \"10134|\"\"S10_1678\"\"|                                            15.0|\n",
      "|     \"10145|\"\"S10_1678\"\"|                                            15.0|\n",
      "|     \"10159|\"\"S10_1678\"\"|                                            15.0|\n",
      "+-----------+------------+------------------------------------------------+\n",
      "only showing top 5 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select ORDERNUMBER, PRODUCTCODE, (2018-YEAR_ID) from sale_table\").show(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44cf4ccf",
   "metadata": {},
   "source": [
    "# 条件筛选"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85e0d642",
   "metadata": {},
   "source": [
    "## 使用DataFrame筛选数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "7eff313b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+---------------+---------+---------------+-------+-------------------+-----------+------+--------+-------+---------------+----+------------+--------------------+--------------------+--------------------+------------+-----------------+------+----------+-----------------+---------+---------------+----------------+\n",
      "|ORDERNUMBER|QUANTITYORDERED|PRICEEACH|ORDERLINENUMBER|  SALES|          ORDERDATE|     STATUS|QTR_ID|MONTH_ID|YEAR_ID|    PRODUCTLINE|MSRP| PRODUCTCODE|        CUSTOMERNAME|               PHONE|        ADDRESSLINE1|ADDRESSLINE2|             CITY| STATE|POSTALCODE|          COUNTRY|TERRITORY|CONTACTLASTNAME|CONTACTFIRSTNAME|\n",
      "+-----------+---------------+---------+---------------+-------+-------------------+-----------+------+--------+-------+---------------+----+------------+--------------------+--------------------+--------------------+------------+-----------------+------+----------+-----------------+---------+---------------+----------------+\n",
      "|     \"10107|             30|     95.7|              2|   2871| \"\"2/24/2003 0:00\"\"|\"\"Shipped\"\"|     1|       2|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Land of Toys In...|      \"\"2125557818\"\"|\"\"897 Long Airpor...|            |          \"\"NYC\"\"|\"\"NY\"\"| \"\"10022\"\"|\"\"United States\"\"|   \"\"NA\"\"|         \"\"Yu\"\"|       \"\"Kwai\"\"\"|\n",
      "|     \"10121|             34|    81.35|              5| 2765.9|  \"\"5/7/2003 0:00\"\"|\"\"Shipped\"\"|     2|       5|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Reims Collectab...|      \"\"26.47.1555\"\"|\"\"59 rue de l'Abb...|            |        \"\"Reims\"\"|      | \"\"51100\"\"|       \"\"France\"\"| \"\"EMEA\"\"|    \"\"Henriot\"\"|       \"\"Paul\"\"\"|\n",
      "|     \"10134|             41|    94.74|              2|3884.34|  \"\"7/1/2003 0:00\"\"|\"\"Shipped\"\"|     3|       7|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"| \"\"Lyon Souveniers\"\"|\"\"+33 1 46 62 7555\"\"|\"\"27 rue du Colon...|            |        \"\"Paris\"\"|      | \"\"75508\"\"|       \"\"France\"\"| \"\"EMEA\"\"|   \"\"Da Cunha\"\"|     \"\"Daniel\"\"\"|\n",
      "|     \"10145|             45|    83.26|              6| 3746.7| \"\"8/25/2003 0:00\"\"|\"\"Shipped\"\"|     3|       8|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Toys4GrownUps.c...|      \"\"6265557265\"\"|\"\"78934 Hillside ...|            |     \"\"Pasadena\"\"|\"\"CA\"\"| \"\"90003\"\"|          \"\"USA\"\"|   \"\"NA\"\"|      \"\"Young\"\"|      \"\"Julie\"\"\"|\n",
      "|     \"10159|             49|      100|             14|5205.27|\"\"10/10/2003 0:00\"\"|\"\"Shipped\"\"|     4|      10|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Corporate Gift ...|      \"\"6505551386\"\"| \"\"7734 Strong St.\"\"|            |\"\"San Francisco\"\"|\"\"CA\"\"|          |\"\"United States\"\"|   \"\"NA\"\"|      \"\"Brown\"\"|      \"\"Julie\"\"\"|\n",
      "+-----------+---------------+---------+---------------+-------+-------------------+-----------+------+--------+-------+---------------+----+------------+--------------------+--------------------+--------------------+------------+-----------------+------+----------+-----------------+---------+---------------+----------------+\n",
      "only showing top 5 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sale_df.filter(\"YEAR_ID='2003'\").show(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ee1934d1",
   "metadata": {},
   "source": [
    "## 使用Spark SQL筛选数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "7611ee50",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+---------------+---------+---------------+-------+-------------------+-----------+------+--------+-------+---------------+----+------------+--------------------+--------------------+--------------------+------------+-----------------+------+----------+-----------------+---------+---------------+----------------+\n",
      "|ORDERNUMBER|QUANTITYORDERED|PRICEEACH|ORDERLINENUMBER|  SALES|          ORDERDATE|     STATUS|QTR_ID|MONTH_ID|YEAR_ID|    PRODUCTLINE|MSRP| PRODUCTCODE|        CUSTOMERNAME|               PHONE|        ADDRESSLINE1|ADDRESSLINE2|             CITY| STATE|POSTALCODE|          COUNTRY|TERRITORY|CONTACTLASTNAME|CONTACTFIRSTNAME|\n",
      "+-----------+---------------+---------+---------------+-------+-------------------+-----------+------+--------+-------+---------------+----+------------+--------------------+--------------------+--------------------+------------+-----------------+------+----------+-----------------+---------+---------------+----------------+\n",
      "|     \"10107|             30|     95.7|              2|   2871| \"\"2/24/2003 0:00\"\"|\"\"Shipped\"\"|     1|       2|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Land of Toys In...|      \"\"2125557818\"\"|\"\"897 Long Airpor...|            |          \"\"NYC\"\"|\"\"NY\"\"| \"\"10022\"\"|\"\"United States\"\"|   \"\"NA\"\"|         \"\"Yu\"\"|       \"\"Kwai\"\"\"|\n",
      "|     \"10121|             34|    81.35|              5| 2765.9|  \"\"5/7/2003 0:00\"\"|\"\"Shipped\"\"|     2|       5|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Reims Collectab...|      \"\"26.47.1555\"\"|\"\"59 rue de l'Abb...|            |        \"\"Reims\"\"|      | \"\"51100\"\"|       \"\"France\"\"| \"\"EMEA\"\"|    \"\"Henriot\"\"|       \"\"Paul\"\"\"|\n",
      "|     \"10134|             41|    94.74|              2|3884.34|  \"\"7/1/2003 0:00\"\"|\"\"Shipped\"\"|     3|       7|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"| \"\"Lyon Souveniers\"\"|\"\"+33 1 46 62 7555\"\"|\"\"27 rue du Colon...|            |        \"\"Paris\"\"|      | \"\"75508\"\"|       \"\"France\"\"| \"\"EMEA\"\"|   \"\"Da Cunha\"\"|     \"\"Daniel\"\"\"|\n",
      "|     \"10145|             45|    83.26|              6| 3746.7| \"\"8/25/2003 0:00\"\"|\"\"Shipped\"\"|     3|       8|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Toys4GrownUps.c...|      \"\"6265557265\"\"|\"\"78934 Hillside ...|            |     \"\"Pasadena\"\"|\"\"CA\"\"| \"\"90003\"\"|          \"\"USA\"\"|   \"\"NA\"\"|      \"\"Young\"\"|      \"\"Julie\"\"\"|\n",
      "|     \"10159|             49|      100|             14|5205.27|\"\"10/10/2003 0:00\"\"|\"\"Shipped\"\"|     4|      10|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Corporate Gift ...|      \"\"6505551386\"\"| \"\"7734 Strong St.\"\"|            |\"\"San Francisco\"\"|\"\"CA\"\"|          |\"\"United States\"\"|   \"\"NA\"\"|      \"\"Brown\"\"|      \"\"Julie\"\"\"|\n",
      "+-----------+---------------+---------+---------------+-------+-------------------+-----------+------+--------+-------+---------------+----+------------+--------------------+--------------------+--------------------+------------+-----------------+------+----------+-----------------+---------+---------------+----------------+\n",
      "only showing top 5 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select * from sale_table where YEAR_ID='2003'\").show(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e713a4e8",
   "metadata": {},
   "source": [
    "# 数据排序"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "984b3271",
   "metadata": {},
   "source": [
    "## 使用DataFrame数据排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "06942c70",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+------------+----------------+\n",
      "|ORDERNUMBER| PRODUCTCODE|(2018 - YEAR_ID)|\n",
      "+-----------+------------+----------------+\n",
      "|     \"10107|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10121|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10134|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10145|\"\"S10_1678\"\"|            15.0|\n",
      "|     \"10159|\"\"S10_1678\"\"|            15.0|\n",
      "+-----------+------------+----------------+\n",
      "only showing top 5 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sale_df.select(\"ORDERNUMBER\", \"PRODUCTCODE\", (2018-sale_df.YEAR_ID)).orderBy(\"YEAR_ID\").show(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "85aa80cb",
   "metadata": {},
   "source": [
    "## 使用DataFrame数据排序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "59109fe7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+------------+------------------------------------------------+\n",
      "|ORDERNUMBER| PRODUCTCODE|(CAST(2018 AS DOUBLE) - CAST(YEAR_ID AS DOUBLE))|\n",
      "+-----------+------------+------------------------------------------------+\n",
      "|     \"10107|\"\"S10_1678\"\"|                                            15.0|\n",
      "|     \"10121|\"\"S10_1678\"\"|                                            15.0|\n",
      "|     \"10134|\"\"S10_1678\"\"|                                            15.0|\n",
      "|     \"10145|\"\"S10_1678\"\"|                                            15.0|\n",
      "|     \"10159|\"\"S10_1678\"\"|                                            15.0|\n",
      "+-----------+------------+------------------------------------------------+\n",
      "only showing top 5 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select ORDERNUMBER, PRODUCTCODE, (2018-YEAR_ID) from sale_table order by YEAR_ID\").show(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8819b779",
   "metadata": {},
   "source": [
    "# 数据去重"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2c61ce69",
   "metadata": {},
   "source": [
    "## 使用DataFrame数据去重"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "5a456863",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-------------+\n",
      "|  PRODUCTCODE|\n",
      "+-------------+\n",
      "| \"\"S18_1097\"\"|\n",
      "| \"\"S24_2011\"\"|\n",
      "| \"\"S18_1342\"\"|\n",
      "| \"\"S18_3232\"\"|\n",
      "| \"\"S18_2625\"\"|\n",
      "| \"\"S10_4698\"\"|\n",
      "| \"\"S12_1099\"\"|\n",
      "|\"\"S700_3505\"\"|\n",
      "| \"\"S18_3782\"\"|\n",
      "| \"\"S24_4048\"\"|\n",
      "| \"\"S50_1392\"\"|\n",
      "|\"\"S700_1691\"\"|\n",
      "| \"\"S24_3816\"\"|\n",
      "| \"\"S18_2795\"\"|\n",
      "| \"\"S24_2360\"\"|\n",
      "| \"\"S18_1984\"\"|\n",
      "| \"\"S24_2300\"\"|\n",
      "| \"\"S50_1341\"\"|\n",
      "| \"\"S18_2581\"\"|\n",
      "| \"\"S24_3432\"\"|\n",
      "+-------------+\n",
      "only showing top 20 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sale_df.select(\"PRODUCTCODE\").distinct().show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "eae70335",
   "metadata": {},
   "source": [
    "## 使用Spark SQL数据去重"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "c8988e28",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-------------+\n",
      "|  PRODUCTCODE|\n",
      "+-------------+\n",
      "| \"\"S18_1097\"\"|\n",
      "| \"\"S24_2011\"\"|\n",
      "| \"\"S18_1342\"\"|\n",
      "| \"\"S18_3232\"\"|\n",
      "| \"\"S18_2625\"\"|\n",
      "| \"\"S10_4698\"\"|\n",
      "| \"\"S12_1099\"\"|\n",
      "|\"\"S700_3505\"\"|\n",
      "| \"\"S18_3782\"\"|\n",
      "| \"\"S24_4048\"\"|\n",
      "| \"\"S50_1392\"\"|\n",
      "|\"\"S700_1691\"\"|\n",
      "| \"\"S24_3816\"\"|\n",
      "| \"\"S18_2795\"\"|\n",
      "| \"\"S24_2360\"\"|\n",
      "| \"\"S18_1984\"\"|\n",
      "| \"\"S24_2300\"\"|\n",
      "| \"\"S50_1341\"\"|\n",
      "| \"\"S18_2581\"\"|\n",
      "| \"\"S24_3432\"\"|\n",
      "+-------------+\n",
      "only showing top 20 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select distinct PRODUCTCODE from sale_table\").show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "68f795fb",
   "metadata": {},
   "source": [
    "# 分组统计"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d0bb669d",
   "metadata": {},
   "source": [
    "## 使用DataFrame数据进行分组统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "0d1ad7b1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-------------+-----+\n",
      "|  PRODUCTCODE|count|\n",
      "+-------------+-----+\n",
      "| \"\"S18_1097\"\"|   28|\n",
      "| \"\"S24_2011\"\"|   26|\n",
      "| \"\"S18_1342\"\"|   26|\n",
      "| \"\"S18_3232\"\"|   52|\n",
      "| \"\"S18_2625\"\"|   26|\n",
      "| \"\"S10_4698\"\"|   26|\n",
      "| \"\"S12_1099\"\"|   25|\n",
      "|\"\"S700_3505\"\"|   26|\n",
      "| \"\"S18_3782\"\"|   25|\n",
      "| \"\"S24_4048\"\"|   26|\n",
      "| \"\"S50_1392\"\"|   28|\n",
      "|\"\"S700_1691\"\"|   26|\n",
      "| \"\"S24_3816\"\"|   26|\n",
      "| \"\"S18_2795\"\"|   26|\n",
      "| \"\"S24_2360\"\"|   25|\n",
      "| \"\"S18_1984\"\"|   27|\n",
      "| \"\"S24_2300\"\"|   27|\n",
      "| \"\"S50_1341\"\"|   26|\n",
      "| \"\"S18_2581\"\"|   23|\n",
      "| \"\"S24_3432\"\"|   23|\n",
      "+-------------+-----+\n",
      "only showing top 20 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sale_df.select(\"PRODUCTCODE\").groupby(\"PRODUCTCODE\").count().show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a33f483a",
   "metadata": {},
   "source": [
    "## 使用Spark SQL数据进行分组统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "b7560d9c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-------------+------+\n",
      "|  PRODUCTCODE|counts|\n",
      "+-------------+------+\n",
      "| \"\"S18_1097\"\"|    28|\n",
      "| \"\"S24_2011\"\"|    26|\n",
      "| \"\"S18_1342\"\"|    26|\n",
      "| \"\"S18_3232\"\"|    52|\n",
      "| \"\"S18_2625\"\"|    26|\n",
      "| \"\"S10_4698\"\"|    26|\n",
      "| \"\"S12_1099\"\"|    25|\n",
      "|\"\"S700_3505\"\"|    26|\n",
      "| \"\"S18_3782\"\"|    25|\n",
      "| \"\"S24_4048\"\"|    26|\n",
      "| \"\"S50_1392\"\"|    28|\n",
      "|\"\"S700_1691\"\"|    26|\n",
      "| \"\"S24_3816\"\"|    26|\n",
      "| \"\"S18_2795\"\"|    26|\n",
      "| \"\"S24_2360\"\"|    25|\n",
      "| \"\"S18_1984\"\"|    27|\n",
      "| \"\"S24_2300\"\"|    27|\n",
      "| \"\"S50_1341\"\"|    26|\n",
      "| \"\"S18_2581\"\"|    23|\n",
      "| \"\"S24_3432\"\"|    23|\n",
      "+-------------+------+\n",
      "only showing top 20 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select PRODUCTCODE, count(*) counts from sale_table group by PRODUCTCODE\").show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "23ff3756",
   "metadata": {},
   "source": [
    "# 数据连接"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0cebbc91",
   "metadata": {},
   "source": [
    "## 使用DataFrames数据连接"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "834dad97",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+--------+\n",
      "|count(1)|\n",
      "+--------+\n",
      "|     901|\n",
      "+--------+\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select count(*) from sale_table where POSTALCODE=''\").show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "081e6ab8",
   "metadata": {},
   "source": [
    "\"ORDERNUMBER,QUANTITYORDERED,PRICEEACH,ORDERLINENUMBER,SALES,\"\"ORDERDATE\"\",\"\"STATUS\"\",QTR_ID,MONTH_ID,YEAR_ID,\"\"PRODUCTLINE\"\",MSRP,\"\"PRODUCTCODE\"\",\"\"CUSTOMERNAME\"\",\"\"PHONE\"\",\"\"ADDRESSLINE1\"\",\"\"ADDRESSLINE2\"\",\"\"CITY\"\",\"\"STATE\"\",\"\"POSTALCODE\"\",\"\"COUNTRY\"\",\"\"TERRITORY\"\",\"\"CONTACTLASTNAME\"\",\"\"CONTACTFIRSTNAME\"\"\"'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "1248f557",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+------------+-----------------+--------------+----------+\n",
      "|ORDERNUMBER| productcode|             city|         state|postalcode|\n",
      "+-----------+------------+-----------------+--------------+----------+\n",
      "|     \"10159|\"\"S10_1678\"\"|\"\"San Francisco\"\"|        \"\"CA\"\"|          |\n",
      "|     \"10180|\"\"S10_1678\"\"|                 |     \"\"Lille\"\"|          |\n",
      "|     \"10188|\"\"S10_1678\"\"|                 |    \"\"Bergen\"\"|          |\n",
      "|     \"10201|\"\"S10_1678\"\"|\"\"San Francisco\"\"|        \"\"CA\"\"|          |\n",
      "|     \"10211|\"\"S10_1678\"\"|                 |     \"\"Paris\"\"|          |\n",
      "|     \"10275|\"\"S10_1678\"\"|                 |    \"\"Nantes\"\"|          |\n",
      "|     \"10299|\"\"S10_1678\"\"|                 |  \"\"Helsinki\"\"|          |\n",
      "|     \"10375|\"\"S10_1678\"\"|                 |    \"\"Nantes\"\"|          |\n",
      "|     \"10403|\"\"S10_1678\"\"|                 | \"\"Liverpool\"\"|          |\n",
      "|     \"10417|\"\"S10_1678\"\"|                 |    \"\"Madrid\"\"|          |\n",
      "|     \"10112|\"\"S10_1949\"\"|                 |     \"\"Lule?\"\"|          |\n",
      "|     \"10304|\"\"S10_1949\"\"|                 |\"\"Versailles\"\"|          |\n",
      "|     \"10333|\"\"S10_1949\"\"|\"\"San Francisco\"\"|        \"\"CA\"\"|          |\n",
      "|     \"10381|\"\"S10_1949\"\"|\"\"San Francisco\"\"|        \"\"CA\"\"|          |\n",
      "|     \"10424|\"\"S10_1949\"\"|                 |    \"\"Madrid\"\"|          |\n",
      "|     \"10159|\"\"S10_2016\"\"|\"\"San Francisco\"\"|        \"\"CA\"\"|          |\n",
      "|     \"10180|\"\"S10_2016\"\"|                 |     \"\"Lille\"\"|          |\n",
      "|     \"10188|\"\"S10_2016\"\"|                 |    \"\"Bergen\"\"|          |\n",
      "|     \"10201|\"\"S10_2016\"\"|\"\"San Francisco\"\"|        \"\"CA\"\"|          |\n",
      "|     \"10275|\"\"S10_2016\"\"|                 |    \"\"Nantes\"\"|          |\n",
      "+-----------+------------+-----------------+--------------+----------+\n",
      "only showing top 20 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select ORDERNUMBER, productcode, city, state, postalcode from sale_table where POSTALCODE=''\").show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "2b83c643",
   "metadata": {},
   "outputs": [],
   "source": [
    "RawZipRDD = sc.textFile(\"/home/jupyter/Zipssortedbycitystate.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "2a472938",
   "metadata": {},
   "outputs": [],
   "source": [
    "ZipRDD = RawZipRDD.map(lambda line: line.split(\",\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "070dbf9c",
   "metadata": {},
   "outputs": [],
   "source": [
    "zip_header = ZipRDD.first()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "ee279ae8",
   "metadata": {},
   "outputs": [],
   "source": [
    "ZipRDD = ZipRDD.filter(lambda line: line != zip_header)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "cd3a09af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['\"ABBEVILLE', 'AL', '36310\"'],\n",
       " ['\"ABBEVILLE', 'LA', '70510\"'],\n",
       " ['\"ABBEVILLE', 'MS', '38601\"'],\n",
       " ['\"ABBOT', 'ME', '4406\"'],\n",
       " ['\"ABBOTT', 'TX', '76621\"']]"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ZipRDD.take(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "f0d402e5",
   "metadata": {},
   "outputs": [],
   "source": [
    "Zip_Rows = ZipRDD.map(lambda p: Row(\n",
    "                                CITY='\"' + p[0]+'\"',\n",
    "                                STATE='\"' + p[1]+'\"',\n",
    "                                POSTALCODE='\"' + p[2]+'\"'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "8ef59eb3",
   "metadata": {},
   "outputs": [],
   "source": [
    "ZIP_df = sqlContext.createDataFrame(Zip_Rows)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "cde73ac9",
   "metadata": {},
   "outputs": [],
   "source": [
    "ZIP_df.registerTempTable(\"zip_table\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "f5917af3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+--------------------+-----+----------+\n",
      "|                CITY|STATE|POSTALCODE|\n",
      "+--------------------+-----+----------+\n",
      "|        \"\"ABBEVILLE\"| \"AL\"|  \"36310\"\"|\n",
      "|        \"\"ABBEVILLE\"| \"LA\"|  \"70510\"\"|\n",
      "|        \"\"ABBEVILLE\"| \"MS\"|  \"38601\"\"|\n",
      "|            \"\"ABBOT\"| \"ME\"|   \"4406\"\"|\n",
      "|           \"\"ABBOTT\"| \"TX\"|  \"76621\"\"|\n",
      "|        \"\"ABBYVILLE\"| \"KS\"|  \"67510\"\"|\n",
      "|      \"\"ABERCROMBIE\"| \"ND\"|  \"58001\"\"|\n",
      "|         \"\"ABERDEEN\"| \"KY\"|  \"42201\"\"|\n",
      "|         \"\"ABERDEEN\"| \"MS\"|  \"39730\"\"|\n",
      "|         \"\"ABERDEEN\"| \"OH\"|  \"45101\"\"|\n",
      "|         \"\"ABERDEEN\"| \"SD\"|  \"57402\"\"|\n",
      "|\"\"ABERDEEN PROVIN...| \"MD\"|  \"21005\"\"|\n",
      "|        \"\"ABERNATHY\"| \"TX\"|  \"79311\"\"|\n",
      "|          \"\"ABILENE\"| \"KS\"|  \"67410\"\"|\n",
      "|          \"\"ABILENE\"| \"TX\"|  \"79602\"\"|\n",
      "|          \"\"ABILENE\"| \"TX\"|  \"79604\"\"|\n",
      "|          \"\"ABILENE\"| \"TX\"|  \"79606\"\"|\n",
      "|          \"\"ABILENE\"| \"TX\"|  \"79697\"\"|\n",
      "|          \"\"ABILENE\"| \"TX\"|  \"79699\"\"|\n",
      "|         \"\"ABINGDON\"| \"MD\"|  \"21009\"\"|\n",
      "+--------------------+-----+----------+\n",
      "only showing top 20 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select * from zip_table\").show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "c9685198",
   "metadata": {},
   "outputs": [],
   "source": [
    "joined_df = sale_df.join(ZIP_df, sale_df.CITY==ZIP_df.CITY, \"left_outer\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "00416e6f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+---------------+---------+---------------+-------+-------------------+-----------+------+--------+-------+---------------+----+------------+--------------------+--------------------+--------------------+--------------------+-----------------+-------------+------------+-----------------+-------------+---------------+----------------+----+-----+----------+\n",
      "|ORDERNUMBER|QUANTITYORDERED|PRICEEACH|ORDERLINENUMBER|  SALES|          ORDERDATE|     STATUS|QTR_ID|MONTH_ID|YEAR_ID|    PRODUCTLINE|MSRP| PRODUCTCODE|        CUSTOMERNAME|               PHONE|        ADDRESSLINE1|        ADDRESSLINE2|             CITY|        STATE|  POSTALCODE|          COUNTRY|    TERRITORY|CONTACTLASTNAME|CONTACTFIRSTNAME|CITY|STATE|POSTALCODE|\n",
      "+-----------+---------------+---------+---------------+-------+-------------------+-----------+------+--------+-------+---------------+----+------------+--------------------+--------------------+--------------------+--------------------+-----------------+-------------+------------+-----------------+-------------+---------------+----------------+----+-----+----------+\n",
      "|     \"10309|             41|      100|              5|4394.38|\"\"10/15/2004 0:00\"\"|\"\"Shipped\"\"|     4|      10|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Baane Mini Impo...|      \"\"07-98 9555\"\"|\"\"Erling Skakkes ...|                    |      \"\"Stavern\"\"|             |    \"\"4110\"\"|       \"\"Norway\"\"|     \"\"EMEA\"\"| \"\"Bergulfsen\"\"|      \"\"Jonas\"\"\"|null| null|      null|\n",
      "|     \"10145|             45|    83.26|              6| 3746.7| \"\"8/25/2003 0:00\"\"|\"\"Shipped\"\"|     3|       8|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Toys4GrownUps.c...|      \"\"6265557265\"\"|\"\"78934 Hillside ...|                    |     \"\"Pasadena\"\"|       \"\"CA\"\"|   \"\"90003\"\"|          \"\"USA\"\"|       \"\"NA\"\"|      \"\"Young\"\"|      \"\"Julie\"\"\"|null| null|      null|\n",
      "|     \"10107|             30|     95.7|              2|   2871| \"\"2/24/2003 0:00\"\"|\"\"Shipped\"\"|     1|       2|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Land of Toys In...|      \"\"2125557818\"\"|\"\"897 Long Airpor...|                    |          \"\"NYC\"\"|       \"\"NY\"\"|   \"\"10022\"\"|\"\"United States\"\"|       \"\"NA\"\"|         \"\"Yu\"\"|       \"\"Kwai\"\"\"|null| null|      null|\n",
      "|     \"10237|             23|      100|              7|2333.12|  \"\"4/5/2004 0:00\"\"|\"\"Shipped\"\"|     2|       4|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"| \"\"Vitachrome Inc.\"\"|      \"\"2125551500\"\"|\"\"2678 Kingston R...|       \"\"Suite 101\"\"|          \"\"NYC\"\"|       \"\"NY\"\"|   \"\"10022\"\"|          \"\"USA\"\"|       \"\"NA\"\"|      \"\"Frick\"\"|    \"\"Michael\"\"\"|null| null|      null|\n",
      "|     \"10329|             42|      100|              1|4396.14|\"\"11/15/2004 0:00\"\"|\"\"Shipped\"\"|     4|      11|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Land of Toys In...|      \"\"2125557818\"\"|\"\"897 Long Airpor...|                    |          \"\"NYC\"\"|       \"\"NY\"\"|   \"\"10022\"\"|\"\"United States\"\"|       \"\"NA\"\"|         \"\"Yu\"\"|       \"\"Kwai\"\"\"|null| null|      null|\n",
      "|     \"10134|             41|    94.74|              2|3884.34|  \"\"7/1/2003 0:00\"\"|\"\"Shipped\"\"|     3|       7|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"| \"\"Lyon Souveniers\"\"|\"\"+33 1 46 62 7555\"\"|\"\"27 rue du Colon...|                    |        \"\"Paris\"\"|             |   \"\"75508\"\"|       \"\"France\"\"|     \"\"EMEA\"\"|   \"\"Da Cunha\"\"|     \"\"Daniel\"\"\"|null| null|      null|\n",
      "|     \"10121|             34|    81.35|              5| 2765.9|  \"\"5/7/2003 0:00\"\"|\"\"Shipped\"\"|     2|       5|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Reims Collectab...|      \"\"26.47.1555\"\"|\"\"59 rue de l'Abb...|                    |        \"\"Reims\"\"|             |   \"\"51100\"\"|       \"\"France\"\"|     \"\"EMEA\"\"|    \"\"Henriot\"\"|       \"\"Paul\"\"\"|null| null|      null|\n",
      "|     \"10223|             37|      100|              1|3965.66| \"\"2/20/2004 0:00\"\"|\"\"Shipped\"\"|     1|       2|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Australian Coll...|               Co.\"\"|    \"\"03 9520 4555\"\"|\"\"636 St Kilda Ro...|      \"\"Level 3\"\"|\"\"Melbourne\"\"|\"\"Victoria\"\"|         \"\"3004\"\"|\"\"Australia\"\"|       \"\"APAC\"\"|    \"\"Ferguson\"\"|null| null|      null|\n",
      "|     \"10263|             34|      100|              2|3676.76| \"\"6/28/2004 0:00\"\"|\"\"Shipped\"\"|     2|       6|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"| \"\"Gift Depot Inc.\"\"|      \"\"2035552570\"\"|\"\"25593 South Bay...|                    |  \"\"Bridgewater\"\"|       \"\"CT\"\"|   \"\"97562\"\"|\"\"United States\"\"|       \"\"NA\"\"|       \"\"King\"\"|      \"\"Julie\"\"\"|null| null|      null|\n",
      "|     \"10318|             46|    94.74|              1|4358.04| \"\"11/2/2004 0:00\"\"|\"\"Shipped\"\"|     4|      11|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Diecast Classic...|      \"\"2155551555\"\"|\"\"7586 Pompton St.\"\"|                    |    \"\"Allentown\"\"|       \"\"PA\"\"|   \"\"70267\"\"|          \"\"USA\"\"|       \"\"NA\"\"|         \"\"Yu\"\"|      \"\"Kyung\"\"\"|null| null|      null|\n",
      "|     \"10168|             36|    96.66|              1|3479.76|\"\"10/28/2003 0:00\"\"|\"\"Shipped\"\"|     4|      10|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Technics Stores...|      \"\"6505556809\"\"|\"\"9408 Furth Circ...|                    |   \"\"Burlingame\"\"|       \"\"CA\"\"|   \"\"94217\"\"|          \"\"USA\"\"|       \"\"NA\"\"|     \"\"Hirano\"\"|       \"\"Juri\"\"\"|null| null|      null|\n",
      "|     \"10285|             36|      100|              6|4099.68| \"\"8/27/2004 0:00\"\"|\"\"Shipped\"\"|     3|       8|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Marta's Replica...|      \"\"6175558555\"\"|\"\"39323 Spinnaker...|                    |    \"\"Cambridge\"\"|       \"\"MA\"\"|   \"\"51247\"\"|          \"\"USA\"\"|       \"\"NA\"\"|  \"\"Hernandez\"\"|      \"\"Marta\"\"\"|null| null|      null|\n",
      "|     \"10251|             28|      100|              2|3188.64| \"\"5/18/2004 0:00\"\"|\"\"Shipped\"\"|     2|       5|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Tekni Collectab...|      \"\"2015559350\"\"|   \"\"7476 Moss Rd.\"\"|                    |       \"\"Newark\"\"|       \"\"NJ\"\"|   \"\"94019\"\"|          \"\"USA\"\"|       \"\"NA\"\"|      \"\"Brown\"\"|    \"\"William\"\"\"|null| null|      null|\n",
      "|     \"10180|             29|    86.13|              9|2497.77|\"\"11/11/2003 0:00\"\"|\"\"Shipped\"\"|     4|      11|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Daedalus Design...|      \"\"20.16.1555\"\"|               \"\"184| chauss?e de Tour...|                 |    \"\"Lille\"\"|            |        \"\"59000\"\"|   \"\"France\"\"|       \"\"EMEA\"\"|       \"\"Ranc?\"\"|null| null|      null|\n",
      "|     \"10188|             48|      100|              1|5512.32|\"\"11/18/2003 0:00\"\"|\"\"Shipped\"\"|     4|      11|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|    \"\"Herkku Gifts\"\"|   \"\"+47 2267 3215\"\"|       \"\"Drammen 121|    PR 744 Sentrum\"\"|                 |   \"\"Bergen\"\"|            |       \"\"N 5804\"\"|   \"\"Norway\"\"|       \"\"EMEA\"\"|      \"\"Oeztan\"\"|null| null|      null|\n",
      "|     \"10211|             41|      100|             14|4708.44| \"\"1/15/2004 0:00\"\"|\"\"Shipped\"\"|     1|       1|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Auto Canal+ Pet...|  \"\"(1) 47.55.6555\"\"|                \"\"25|     rue Lauriston\"\"|                 |    \"\"Paris\"\"|            |        \"\"75016\"\"|   \"\"France\"\"|       \"\"EMEA\"\"|     \"\"Perrier\"\"|null| null|      null|\n",
      "|     \"10275|             45|    92.83|              1|4177.35| \"\"7/23/2004 0:00\"\"|\"\"Shipped\"\"|     3|       7|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"La Rochelle Gif...|      \"\"40.67.8555\"\"|                \"\"67| rue des Cinquant...|                 |   \"\"Nantes\"\"|            |        \"\"44000\"\"|   \"\"France\"\"|       \"\"EMEA\"\"|     \"\"Labrune\"\"|null| null|      null|\n",
      "|     \"10299|             23|      100|              9|2597.39| \"\"9/30/2004 0:00\"\"|\"\"Shipped\"\"|     3|       9|   2004|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|   \"\"Toys of Finland|               Co.\"\"|     \"\"90-224 8555\"\"|   \"\"Keskuskatu 45\"\"|                 | \"\"Helsinki\"\"|            |        \"\"21240\"\"|  \"\"Finland\"\"|       \"\"EMEA\"\"|   \"\"Karttunen\"\"|null| null|      null|\n",
      "|     \"10159|             49|      100|             14|5205.27|\"\"10/10/2003 0:00\"\"|\"\"Shipped\"\"|     4|      10|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"|\"\"Corporate Gift ...|      \"\"6505551386\"\"| \"\"7734 Strong St.\"\"|                    |\"\"San Francisco\"\"|       \"\"CA\"\"|            |\"\"United States\"\"|       \"\"NA\"\"|      \"\"Brown\"\"|      \"\"Julie\"\"\"|null| null|      null|\n",
      "|     \"10201|             22|    98.57|              2|2168.54| \"\"12/1/2003 0:00\"\"|\"\"Shipped\"\"|     4|      12|   2003|\"\"Motorcycles\"\"|  95|\"\"S10_1678\"\"| \"\"Mini Wheels Co.\"\"|      \"\"6505555787\"\"|\"\"5557 North Pend...|                    |\"\"San Francisco\"\"|       \"\"CA\"\"|            |\"\"United States\"\"|       \"\"NA\"\"|     \"\"Murphy\"\"|      \"\"Julie\"\"\"|null| null|      null|\n",
      "+-----------+---------------+---------+---------------+-------+-------------------+-----------+------+--------+-------+---------------+----+------------+--------------------+--------------------+--------------------+--------------------+-----------------+-------------+------------+-----------------+-------------+---------------+----------------+----+-----+----------+\n",
      "only showing top 20 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "joined_df.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a61dafbd",
   "metadata": {},
   "source": [
    "## 使用Spark SQL数据连接"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "14071730",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+-----------+---------------+---------+---------------+-------+-------------------+------------+------+--------+-------+--------------------+----+------------+--------------------+--------------+--------------------+------------+------------+------+----------+-----------+---------+---------------+----------------+----------+\n",
      "|ORDERNUMBER|QUANTITYORDERED|PRICEEACH|ORDERLINENUMBER|  SALES|          ORDERDATE|      STATUS|QTR_ID|MONTH_ID|YEAR_ID|         PRODUCTLINE|MSRP| PRODUCTCODE|        CUSTOMERNAME|         PHONE|        ADDRESSLINE1|ADDRESSLINE2|        CITY| STATE|POSTALCODE|    COUNTRY|TERRITORY|CONTACTLASTNAME|CONTACTFIRSTNAME|POSTALCODE|\n",
      "+-----------+---------------+---------+---------------+-------+-------------------+------------+------+--------+-------+--------------------+----+------------+--------------------+--------------+--------------------+------------+------------+------+----------+-----------+---------+---------------+----------------+----------+\n",
      "|     \"10219|             48|      100|              2|4891.68| \"\"2/10/2004 0:00\"\"| \"\"Shipped\"\"|     1|       2|   2004|\"\"Trucks and Buses\"\"| 118|\"\"S12_4473\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             50|      100|              4| 5907.5| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"| 102|\"\"S18_1342\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             30|    58.22|              3| 1746.6| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"|  53|\"\"S18_1367\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             34|      100|             11| 5375.4| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"| 170|\"\"S18_1749\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10219|             43|      100|              1|8448.64| \"\"2/10/2004 0:00\"\"| \"\"Shipped\"\"|     1|       2|   2004|    \"\"Classic Cars\"\"| 163|\"\"S18_2238\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             24|    62.36|             10|1496.64| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"|  60|\"\"S18_2248\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             33|      100|              8|4950.33| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"| 127|\"\"S18_2325\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             23|      100|              5|4230.62| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"| 168|\"\"S18_2795\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             42|    94.25|              2| 3958.5| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"|  99|\"\"S18_3320\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             36|    33.19|              7|1194.84| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"|  33|\"\"S24_1937\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             49|    49.28|              6|2414.72| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"|  44|\"\"S24_2022\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10219|             21|    40.31|              3| 846.51| \"\"2/10/2004 0:00\"\"| \"\"Shipped\"\"|     1|       2|   2004|    \"\"Classic Cars\"\"|  35|\"\"S24_2840\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             26|    38.98|              9|1013.48| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"|  41|\"\"S24_3969\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10149|             20|    90.57|              1| 1811.4| \"\"9/12/2003 0:00\"\"| \"\"Shipped\"\"|     3|       9|   2003|    \"\"Vintage Cars\"\"|  97|\"\"S24_4258\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10219|             35|    55.19|              4|1931.65| \"\"2/10/2004 0:00\"\"| \"\"Shipped\"\"|     1|       2|   2004|\"\"Trucks and Buses\"\"|  54|\"\"S32_2509\"\"|\"\"Signal Collecti...|\"\"4155554312\"\"|\"\"2793 Furth Circ...|            |\"\"Brisbane\"\"|\"\"CA\"\"| \"\"94217\"\"|    \"\"USA\"\"|   \"\"NA\"\"|     \"\"Taylor\"\"|        \"\"Sue\"\"\"|      null|\n",
      "|     \"10164|             21|      100|              2|3536.82|\"\"10/21/2003 0:00\"\"|\"\"Resolved\"\"|     4|      10|   2003|    \"\"Classic Cars\"\"| 147|\"\"S10_4962\"\"| \"\"Mini Auto Werke\"\"| \"\"7675-3555\"\"|    \"\"Kirchgasse 6\"\"|            |    \"\"Graz\"\"|      |  \"\"8010\"\"|\"\"Austria\"\"| \"\"EMEA\"\"|     \"\"Mendel\"\"|     \"\"Roland\"\"\"|      null|\n",
      "|     \"10164|             49|      100|              6|6563.06|\"\"10/21/2003 0:00\"\"|\"\"Resolved\"\"|     4|      10|   2003|\"\"Trucks and Buses\"\"| 136|\"\"S12_1666\"\"| \"\"Mini Auto Werke\"\"| \"\"7675-3555\"\"|    \"\"Kirchgasse 6\"\"|            |    \"\"Graz\"\"|      |  \"\"8010\"\"|\"\"Austria\"\"| \"\"EMEA\"\"|     \"\"Mendel\"\"|     \"\"Roland\"\"\"|      null|\n",
      "|     \"10170|             47|      100|              4|5464.69| \"\"11/4/2003 0:00\"\"| \"\"Shipped\"\"|     4|      11|   2003|    \"\"Classic Cars\"\"| 117|\"\"S12_3380\"\"| \"\"Mini Auto Werke\"\"| \"\"7675-3555\"\"|    \"\"Kirchgasse 6\"\"|            |    \"\"Graz\"\"|      |  \"\"8010\"\"|\"\"Austria\"\"| \"\"EMEA\"\"|     \"\"Mendel\"\"|     \"\"Roland\"\"\"|      null|\n",
      "|     \"10170|             41|      100|              3| 4391.1| \"\"11/4/2003 0:00\"\"| \"\"Shipped\"\"|     4|      11|   2003|    \"\"Classic Cars\"\"| 115|\"\"S12_4675\"\"| \"\"Mini Auto Werke\"\"| \"\"7675-3555\"\"|    \"\"Kirchgasse 6\"\"|            |    \"\"Graz\"\"|      |  \"\"8010\"\"|\"\"Austria\"\"| \"\"EMEA\"\"|     \"\"Mendel\"\"|     \"\"Roland\"\"\"|      null|\n",
      "|     \"10164|             36|    99.17|              8|3570.12|\"\"10/21/2003 0:00\"\"|\"\"Resolved\"\"|     4|      10|   2003|\"\"Trucks and Buses\"\"| 116|\"\"S18_1097\"\"| \"\"Mini Auto Werke\"\"| \"\"7675-3555\"\"|    \"\"Kirchgasse 6\"\"|            |    \"\"Graz\"\"|      |  \"\"8010\"\"|\"\"Austria\"\"| \"\"EMEA\"\"|     \"\"Mendel\"\"|     \"\"Roland\"\"\"|      null|\n",
      "+-----------+---------------+---------+---------------+-------+-------------------+------------+------+--------+-------+--------------------+----+------------+--------------------+--------------+--------------------+------------+------------+------+----------+-----------+---------+---------------+----------------+----------+\n",
      "only showing top 20 rows\n",
      "\n"
     ]
    }
   ],
   "source": [
    "sqlContext.sql(\"select s.*, z.POSTALCODE from sale_table s left join zip_table z on s.CITY = z.CITY\").show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97fc9516",
   "metadata": {},
   "source": [
    "# 数据绘图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "6a2c8bfd",
   "metadata": {},
   "outputs": [],
   "source": [
    "from pandas import DataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "00cc0e06",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     Name  Age\n",
      "0    Alex   10\n",
      "1     Bob   12\n",
      "2  Clarke   13\n"
     ]
    }
   ],
   "source": [
    "data = [['Alex', 10], ['Bob', 12], ['Clarke', 13]]\n",
    "df = DataFrame(data, columns=['Name', 'Age'])\n",
    "print(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "612b931c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>state</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>\"\"NV\"\"</th>\n",
       "      <td>29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"PA\"\"</th>\n",
       "      <td>54</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Frankfurt\"\"</th>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Gen?ve\"\"</th>\n",
       "      <td>31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Madrid\"\"</th>\n",
       "      <td>272</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Melbourne\"\"</th>\n",
       "      <td>55</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Strasbourg\"\"</th>\n",
       "      <td>19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Chatswood\"\"</th>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Paris\"\"</th>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Barcelona\"\"</th>\n",
       "      <td>23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"London\"\"</th>\n",
       "      <td>38</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"NH\"\"</th>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Los Angeles\"\"</th>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Glen Waverly\"\"</th>\n",
       "      <td>23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Espoo\"\"</th>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"NJ\"\"</th>\n",
       "      <td>21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Oulu\"\"</th>\n",
       "      <td>32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Isle of Wight\"\"</th>\n",
       "      <td>26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"MA\"\"</th>\n",
       "      <td>190</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Philadelphia\"\"</th>\n",
       "      <td>21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Nantes\"\"</th>\n",
       "      <td>60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Dublin\"\"</th>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"South Brisbane\"\"</th>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Charleroi\"\"</th>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Tsawassen\"\"</th>\n",
       "      <td>26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Minato-ku\"\"</th>\n",
       "      <td>32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Bergen\"\"</th>\n",
       "      <td>29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"BC\"\"</th>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Marseille\"\"</th>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Lule?\"\"</th>\n",
       "      <td>19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"CT\"\"</th>\n",
       "      <td>61</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Munich\"\"</th>\n",
       "      <td>14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"NY\"\"</th>\n",
       "      <td>178</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Helsinki\"\"</th>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Liverpool\"\"</th>\n",
       "      <td>29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"North Sydney\"\"</th>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"K?ln\"\"</th>\n",
       "      <td>26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Lille\"\"</th>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <td>667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Qu?bec\"\"</th>\n",
       "      <td>22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"CA\"\"</th>\n",
       "      <td>402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Manchester\"\"</th>\n",
       "      <td>51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>\"\"Versailles\"\"</th>\n",
       "      <td>18</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    count\n",
       "state                    \n",
       "\"\"NV\"\"                 29\n",
       "\"\"PA\"\"                 54\n",
       "\"\"Frankfurt\"\"          22\n",
       "\"\"Gen?ve\"\"             31\n",
       "\"\"Madrid\"\"            272\n",
       "\"\"Melbourne\"\"          55\n",
       "\"\"Strasbourg\"\"         19\n",
       "\"\"Chatswood\"\"          46\n",
       "\"\"Paris\"\"              27\n",
       "\"\"Barcelona\"\"          23\n",
       "\"\"London\"\"             38\n",
       "\"\"NH\"\"                 34\n",
       "\"\"Los Angeles\"\"        14\n",
       "\"\"Glen Waverly\"\"       23\n",
       "\"\"Espoo\"\"              30\n",
       "\"\"NJ\"\"                 21\n",
       "\"\"Oulu\"\"               32\n",
       "\"\"Isle of Wight\"\"      26\n",
       "\"\"MA\"\"                190\n",
       "\"\"Philadelphia\"\"       21\n",
       "\"\"Nantes\"\"             60\n",
       "\"\"Dublin\"\"             16\n",
       "\"\"South Brisbane\"\"     15\n",
       "\"\"Charleroi\"\"           8\n",
       "\"\"Tsawassen\"\"          26\n",
       "\"\"Minato-ku\"\"          32\n",
       "\"\"Bergen\"\"             29\n",
       "\"\"BC\"\"                 22\n",
       "\"\"Marseille\"\"          25\n",
       "\"\"Lule?\"\"              19\n",
       "\"\"CT\"\"                 61\n",
       "\"\"Munich\"\"             14\n",
       "\"\"NY\"\"                178\n",
       "\"\"Helsinki\"\"           30\n",
       "\"\"Liverpool\"\"          29\n",
       "\"\"North Sydney\"\"       46\n",
       "\"\"K?ln\"\"               26\n",
       "\"\"Lille\"\"              20\n",
       "                      667\n",
       "\"\"Qu?bec\"\"             22\n",
       "\"\"CA\"\"                402\n",
       "\"\"Manchester\"\"         51\n",
       "\"\"Versailles\"\"         18"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "GroupByState_df = sale_df.groupBy('state').count()\n",
    "GroupByState_pandas_df = GroupByState_df.toPandas().set_index('state')\n",
    "GroupByState_pandas_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "c14a0abd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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nsyjjz7K61//es477zz23ntvzj77bLbaaisA1llnHW644Qbe8573cMkll/Dcc8913P7SSy/NE088oXQLERERqaxTgYN+FywYDRQkFzR16lQ+97nPsc0227DYYoux6aabctJJJ7H//vtz/PHHM2XKFH7wgx8AcMABB7Dzzjuz8cYbs8MOO7DUUkt13P6BBx7IDjvswGqrrcbll1/e6z9HRERERNowd+/3MQyz2Wab+YwZMxa67dZbb+XlL395n46o/8b63y8iIiLFqSe5GDO7wd03a3afcpJFRERERHIUJIuIiIiI5ChIFhERERHJGVVB8iDmT4+Esfp3i4iIiPTLqAmSJ06cyCOPPDLmAkZ355FHHmHixIn9PhQRERGRMWPUlIBbY401mD17NnPmzOn3oYy4iRMnssYaa/T7MERERETGjFETJC+++OK8+MUv7vdhiIiIiMgYMGrSLURERERERoqCZBERERGRHAXJIiIiIiI5CpJFRERERHIUJIuIiIiI5ChIFhERERHJUZAsIiIiIpKjIFlEREREJEdBsoiIiIhIjoJkEREREZEcBckiIiIiIjkKkkVEREREchQki4iIiIjkKEgWEREREclRkCwiIiIikqMgWUREREQkR0GyiIiIiEiOgmQRERERkZzCQbKZvdfMbjWzp8zsTjPbKt2+nZndZmbzzexyM1s702aCmZ1mZo+b2QNmdmgv/ggRERERkToVCpLN7E3Al4H9gaWBrYF/mtmKwIXAEcAKwAzg/EzT6cB6wNrAtsBhZrZDXQcvIiIiItILRXuSvwAc5e5/dPcX3P1ed78XeBcw090vcPeniaB4YzPbILXbFzja3ee6+63Ad4H96v0TRERERETq1TFINrPFgM2AKWZ2h5nNNrNvmtmLgKnAzY3HuvtTwJ3AVDNbHlg1e3/6eWqdf4CIiIiISN2K9CSvDCwOvBvYCtgE2BQ4HJgEzMs9fh6RkjEp83v+vmHM7EAzm2FmM+bMmVP0+EVEREREalckSP53+v8kd7/f3R8Gvga8BXgSWCb3+GWAJ9J95O5v3DeMu5/q7pu5+2ZTpkwpevwiIiIiIrXrGCS7+1xgNuDZm9P/M4GNGzea2VLAukSe8lzg/uz96eeZFY9ZRERERKSnik7c+wHwETNbKeUaHwL8DLgI2NDMdjGzicDngVvc/bbU7gzgcDNbPk3m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REREchQki4iIiIjkKEgWEREREclRkCwiIiIikqMgWUREREQkR0GyiIiIiEiOgmQRERERkRwFySIiIiIiOQqSRURERERyFCSLiIiIiOQoSBYRERERyVGQLCIiIiKSoyBZRERERCRHQbKIiIiISI6CZBERERGRHAXJIiIiIiI5hYJkMzvLzO43s8fN7HYz+0Dmvu3M7DYzm29ml5vZ2pn7JpjZaandA2Z2aC/+CBERERGROhXtST4WWMfdlwHeDnzRzF5tZisCFwJHACsAM4DzM+2mA+sBawPbAoeZ2Q41HbuIiIiISE+ML/Igd5+Z/TX9Wxd4NTDT3S8AMLPpwMNmtoG73wbsC+zn7nOBuWb2XWA/4Je1/QUiIiIiIjUrnJNsZqeY2XzgNuB+4OfAVODmxmPc/SngTmCqmS0PrJq9P/08tcX2DzSzGWY2Y86cOV3/ISIiIiIidSkcJLv7h4Clga2IFItngEnAvNxD56XHTcr8nr+v2fZPdffN3H2zKVOmFD0sEREREZHadVXdwt2fd/ergTWAg4AngWVyD1sGeCLdR+7+xn0iIiIiIgOrbAm48URO8kxg48aNZrZU4/aUh3x/9v70cza/WURERERk4HQMks1sJTN7r5lNMrPFzOzNwO7A74CLgA3NbBczmwh8HrglTdoDOAM43MyWN7MNgAOAH/bkLxERERERqUmRnmQnUitmA3OBrwIfc/dL3H0OsAtwTLrvtcB7M22PJCby3QVcCRzv7qpsISIiIiIDrWMJuBQIb9Pm/t8CG7S47xngfemfiIiIiMiooGWpRURERERyFCSLiIiIiOQoSBYRERERyVGQLCIiIiKSoyBZRERERCRHQbKIiIiISE7HEnDSP+t8+rK29886bqcROhIRERGRsUU9ySIiIiIiOQqSRURERERyFCSLiIiIiOQoSBYRERERyVGQLCIiIiKSoyBZRERERCRHQbKIiIiISI6CZBERERGRHAXJIiIiIiI5CpJFRERERHIUJIuIiIiI5ChIFhERERHJUZAsIiIiIpKjIFlEREREJEdBsoiIiIhIjoJkEREREZEcBckiIiIiIjkKkkVEREREchQki4iIiIjkKEgWEREREclRkCwiIiIikqMgWUREREQkR0GyiIiIiEiOgmQRERERkRwFySIiIiIiOQqSRURERERyFCSLiIiIiOQoSBYRERER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/vd036HAa919tz4eokjfjfYSj1IPBckiImOMmS1NTNa73d2fyNy+PvCEu9/Xt4MTGQAq8SigIFlEREREZBjlJIuIjCHqIRMRKUZBsojI2DKt3wcgIjIaKN1CRGQM0UpiIiLFqCdZRGRs0QpiIiIFqCdZRERERCRHPckiImOIVhITESlGQbKIyNiilcRERApQuoWIyBiilcRERIpRkCwiMoaoTrKISDEKkkVEREREcsb1+wBERERERAaNgmQRERERkRwFySIiIiIiOQqSRURGETP7mJktWdfjRESkOU3cExEZRcxsFrCZuz9cx+NERKQ59SSLiAwoM1vKzC4zs5vN7K9mdiSwGnC5mV2eHvMtM5thZjPN7AvptoObPG57M7vOzG40swvMbFK//i4RkdFAPckiIgPKzHYBdnD3A9LvywI3k+khNrMV3P1RM1sM+B1wsLvfku1JNrMVgQuBHd39KTP7FDDB3Y/qx98lIjIaqCdZRGRw/QV4k5l92cy2cvd5TR7zHjO7EbgJmAq8osljXpduv8bM/g/YF1i7R8csIrJIGN/vAxARkebc/XYzexXwFuCLZva77P1m9mLgE8Br3H2umf0QmNhkUwb8xt137/Uxi4gsKtSTLCIyoMxsNWC+u58FHA+8CngCWDo9ZBngKWCema0M7Jhpnn3cH4E3mNlL03aXMrOXjcCfICIyaqknWURkcL0SON7MXgCeAw4CtgB+aWb3ufu2ZnYTcBtwD3BNpu2pucftB5xrZhPS/YcDt4/UHyIiMtpo4p6IiIiISI7SLUREREREchQki4iIiIjkKEgWEREREclRkCwiIiIikqMgWUREREQkR0GyiIiIiEiOgmQRERERkRwFySIiIiIiOf8PVj/QoaT2WKsAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "ax = GroupByState_pandas_df['count'].plot(kind='bar',title='state', figsize=(12,6), legend=True, fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "38c76b27",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
